Shader "Custom/M9-Specular_Fragment_BlinnPhong"
{
	Properties{
		_Diffuse("Diffuse Color",Color)=(1,1,1,1)
		_Specular("Specular Color",Color)=(1,1,1,1)
		_Gloss("Gloss",Range(8,100))=10
	}

    SubShader{
    	Pass{
    	
    		Tags{
    			//使用的光照模型
    			"LightModel" = "ForwardBase"
    		}
    	
    		CGPROGRAM
    		
    		//引入Unity的光照文件 => 相对于C#中使用 using 
    		#include "Lighting.cginc" 
    		//取得第一个直射光的颜色 => _LightColor0 , 第一个直射光的位置 => _WorldSpaceLightPos0
    		
    		//声明顶点函数和片元函数
    		#pragma vertex vert
    		#pragma fragment frag
    		
    		fixed4 _Diffuse;//控制漫反射的颜色
    		half _Gloss;//控制高光反射的亮度
    		fixed4 _Specular;//控制高光反射的颜色
    		
    		struct a2v{
    			// 告诉Unity把模型空间下的顶点坐标填充给 vertex
    			float4 vertex : POSITION;
    			//获取到模型空间下的法线
    			float3 normal : NORMAL;
    		};
    		
    		struct v2f{
    			float4 position : SV_POSITION;
    			float3 worldNormal : TEXCOORD0;
    			float4 worldVertex : TEXCOORD1;
    		};
    		
    		v2f vert(a2v v) {
    			v2f f;
    			
    			f.position = UnityObjectToClipPos(v.vertex);
    			//f.worldNormal = mul(v.normal,(float3x3)unity_WorldToObject);
    			f.worldNormal = UnityObjectToWorldNormal(v.normal);
    			f.worldVertex = mul(v.vertex,unity_WorldToObject);
    			
    			return f;
    		}
    		
    		fixed4 frag(v2f f) : SV_Target{
    		
    			//获取环境光
    			fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
    			
    			//问:为什么说光的方向就是光的位置?
    			//答:对于每个顶点来说,光的位置就是光的方向,因为光是平行光
    			//_WorldSpaceLightPos0.xyz 是一个向量,而 normalize就是将这个向量给归一化
    			//fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
    			fixed3 lightDir = normalize(WorldSpaceLightDir(f.worldVertex));
    			//获取法线的方向
    			fixed3 normalDir = normalize(f.worldNormal);
    			//获取漫反射的颜色,如果需要外部来控制颜色的改变只需要乘以颜色值即可,如:_Diffuse.rgb
    			fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir,lightDir),0) * _Diffuse.rgb;
    			//相机视野方向
    			//fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - f.worldVertex);
    			fixed3 viewDir = normalize(UnityWorldSpaceViewDir(f.worldVertex));
    			//平行光和视野方向平分线方向
    			fixed3 halfDir = normalize(lightDir + viewDir);
    			//高光反射
    			fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(dot(normalDir,halfDir),0),_Gloss);
    			
    			fixed3 tempColor = diffuse + ambient + specular;
    		
    			return fixed4(tempColor,1);
    		}
    		ENDCG
    	}
    }
    Fallback "VertexLit"
}